# 整体思路
# 对于一个包含 n 个元素的集合，它的子集数量是 2^n个
# 这是因为对于集合中的每个元素，在子集中都有两种状态：存在或者不存在。
# 我们可以用一个长度为 n 的二进制数来表示每个子集，二进制数的每一位对应集合中的一个元素，
# 若该位为 1 ，则表示对应元素在子集中；若为 0 ，则表示不在子集中。通过遍历从 0 到 2^n-1
# 的所有整数，就可以得到所有可能的二进制表示，进而得到所有子集。

def enumerate_subsets(s):
    n = len(s)
    # 遍历从 0 到 2^n - 1 的所有整数
    for i in range(1 << n):
        subset = []
        # 通过 二进制 判断
        for j in range(n):
            # 检查第 j 位是否为 1
            if (i >> j) & 1:
                subset.append(s[j])
        print(subset)

# 示例集合
s = [1, 2, 3]
enumerate_subsets(s)
# 总共子集的个数 为2^n
# []
# [1]
# [2]
# [1, 2]
# [3]
# [1, 3]
# [2, 3]
# [1, 2, 3]